import { BaseMessage } from "../message/base";
import { TokenStatistical } from "../token/tokenStatistical";
import { personConfigs } from "../config";

export interface ModelBackendConfig {
    modelMaker: string;
    modelType: string;
    modelConfig: Record<string, any>;
}

export abstract class ModelBackend {
    /** 模型制造商 */
    public modelMaker: string;
    /** 模型类型 */
    public modelType: string;
    /** 模型配置 */
    public modelConfig: Record<string, any>;

    /**
     * 构造函数
     * @param modelType 模型类型
     * @param modelConfig 模型配置
     */
    constructor(config?: ModelBackendConfig) {
        const { modelMaker, modelType, modelConfig } =
            config ?? personConfigs.defaultModelBackendConfig;
        this.modelMaker = modelMaker;
        this.modelType = modelType;
        this.modelConfig = modelConfig;
    }

    /**
     * 执行模型
     * @param message 输入的消息
     * @returns 成功执行模型的输出消息，失败则返回 undefined
     *
     * @description
     *
     * 输入的消息是一个数组
     * 第一个元素为系统消息 {@link SystemMessage}，传入模型人设信息。
     * 之后的消息为 {@link ChatMessage}，传入模型对话信息。
     * 奇数索引为 {@link SendingChatMessage} 表示 Agent 发送的消息；
     * 偶数索引为 {@link ReceivingChatMessage} 表示 Agent 接收的消息。
     */
    abstract run(message: BaseMessage[]): Promise<BaseMessage | undefined>;
    /**
     * 获取模型的token数量限制
     */
    abstract getTokenLimit(): number;

    /**
     * 从消息中获取token数量
     * @param message 输入的消息
     * @returns token数量
     */
    getTokenNumberFromMessage(messages: BaseMessage[] | string): number {
        return TokenStatistical.getInstance().getTokenNumberFromMessage(messages, this.modelType);
    }
}
